// m

// 给你一个长度为n的整数数组nums，其中nums的所有整数都在范围[1, n]内，且每个整数出现一次或者两次，请你找出所有出现两次的整数，并以数组的形式返回

// 要求，设计并实现一个时间复杂度为O(n)且仅使用常量额外空间的算法解决此问题

// 解法1： 使用正负号作为标记
// 对数组进行遍历，考虑nums[nums[i] - 1]的正负性
// 1. 如果nums[nums[i] - 1]是正数，说明nums[i]还没有出现，我们将nums[nums[i] - 1]加上负号
// 2. 如果nums[nums[i] - 1]是负数，说明nums[i]已经出现过一次，我们将nums[i]放入答案中


function findDuplicates(nums) {
    const n = nums.length
    const ans = []
    for (let i = 0; i < n; i++) {
        const x = Math.abs(nums[i])
        if (nums[x - 1] > 0) {
            nums[x - 1] = -nums[x - 1]
        } else {
            ans.push(x)
        }
    }
    return ans
}

let nums = [4,3,2,7,8,2,3,1]
console.log(findDuplicates(nums))